home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
fmlbp
/
fmlbp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-02-12
|
4KB
|
230 lines
/*
** FMLBP.C by JOUJI
**
** Ver.1.00 1994.7
** Ver.1.10 1994.12 プリントファイルの最初の一行を無視しないようにした。
** ビットイメージ印字機能の変更
**
** 使い方:fmlbp { file_name | /parameter } ...
**
** '/'で始まる文字列はパラメーターとして扱われる。"$xx"は16進データ。
*/
#include <stdio.h>
#include <stdlib.h>
#include <jctype.h>
char _asm_p();
#ifdef TOWNS
/* FMR&TOWNS BIOS */
#define bios_asm(x) \
_asm_p("\n\tINT\t94H\n", 0x100, _asm_p, _asm_p, (char)(x))
#else
/* FMV用 IBM/PC BIOS */
#define bios_asm(x) \
_asm_p("\n\tMOV\tAH,0\n\tINT\t17H\n", (char)(x), _asm_p, _asm_p, 0)
#endif
void print_file(char *fname);
void print_cc(char *cc);
static char line[256];
main(int argc,char *argv[])
{
int i;
if (argc<2) {
puts("Parameter error !\n");
exit(1);
}
for(i=1; i<argc; i++) {
if(argv[i][0] == '/') {
print_cc(argv[i]);
} else {
print_file(argv[i]);
}
}
}
char hex2char(char *p)
{
char x, y, c;
x=0;
c=toupper(*(p++));
x = (c>='0' && c<='9') ? c - '0' : c - '7';
c=toupper(*p);
y = (c>='0' && c<='9') ? c - '0' : c - '7';
x=(x << 4) + y;
return x;
}
void bios_print(char c)
{
char d;
union {
unsigned short w;
struct {
char l;
char h;
} b;
} ax;
for(;;) {
ax.w = bios_asm(c);
#ifdef TOWNS
if(!ax.b.h) return;
#else
if(!(ax.b.h & '\x01')) return;
#endif
if(kbhit()) {
d = getch();
if(d == '\x1b' || d == '\x03') exit(2);
}
}
}
void bios_puts(char *p)
{
for( ; *p != '\0'; p++)
bios_print(*p);
}
void PrintControl(void)
{
char c, s[20], *p;
int i, bn, xb;
FILE *fq;
union {
unsigned short w;
struct {
char l;
char h;
} b;
} x, y;
if(line[0] == 0x03) { /* ^C:コメント */
return;
} else if(line[0] == 0x04) { /* ^D:ビット・イメージ2 */
for(i=1; i<255; i++) {
if(line[i] == '\n') {
line[i] = '\0';
break;
}
}
if( (fq=fopen(&line[1], "rb")) == NULL) {
puts("File not exist !\n");
return;
}
x.b.l=fgetc(fq);
x.b.h=fgetc(fq);
y.b.l=fgetc(fq);
y.b.h=fgetc(fq);
xb = x.w % 8 ? x.w/8 + 1 : x.w / 8;
bn = xb * y.w;
sprintf(s,"\x1bQ%d;%d;0!a", bn, x.w);
bios_puts(s);
while((i=fgetc(fq)) != EOF)
bios_print(i);
fclose(fq);
} else if(line[0] == 0x05) { /* ^E:16進データ */
for(p = line + 1; *p != '\n'; p += 2) {
c = hex2char(p);
bios_print(c);
}
} else if(line[0] == 0x06) { /* ^F:ビット・イメージ1 */
for(i=1; i<255; i++) {
if(line[i] == '\n') {
line[i] = '\0';
break;
}
}
if( (fq=fopen(&line[1], "rb")) == NULL) {
puts("File not exist !\n");
return;
}
while((i=fgetc(fq)) != EOF)
bios_print(i);
fclose(fq);
} else {
for(i=0; i<255; i++) {
c = line[i];
if(c == '\n' || c == '\0')
break;
bios_print(c);
}
}
}
void PrintLine(void)
{
char c, d;
int i;
union {
unsigned short w;
struct {
char l;
char h;
} b;
} sjis, jis;
for(i=0; i<255; i++) {
c = line[i];
if(c == '\n' || c == '\0')
break;
if( (c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xff) ) {
d = line[++i];
if(d == '\n' || d == '\0') break;
sjis.b.h = c;
sjis.b.l = d;
jis.w = mstojis(sjis.w);
bios_print(jis.b.h);
bios_print(jis.b.l);
} else if(c >= 0xa0) {
bios_print(0x2e);
bios_print(c - 0x80);
} else if(c >= 0x20) {
bios_print(0x2d);
bios_print(c);
} else {
bios_print(c);
}
}
}
void print_file(char *fname)
{
FILE *fp;
if( (fp=fopen(fname,"r")) == NULL) {
puts("File not exist !\n");
return;
}
/* fgets(line, 256, fp); */ /* ファイルの最初の一行無視 */
while( fgets(line, 256, fp) != NULL) {
if(line[0] <= 0x1f) {
PrintControl();
}
else {
PrintLine();
}
}
fclose(fp);
}
void print_cc(char *p)
{
char c;
for( p++; *p != '\0'; p++ ) {
c = *p;
if( c == '$' ) {
c = hex2char(++p);
p++;
}
bios_print(c);
}
}